OpenClaw API 集成完全指南
OpenClaw 提供丰富的 API 接口,可以与其他系统集成,实现更强大的自动化能力。本文详细介绍如何调用外部 API、处理响应数据、构建集成方案。
一、工具概述
API 集成能力
- HTTP 请求:GET、POST、PUT、DELETE 等
- 数据处理:JSON、XML、文本解析
- 认证方式:API Key、OAuth、Bearer Token
- 错误处理:超时、重试、降级
基本用法
javascript
// 使用 web_fetch 获取网页内容
web_fetch(
url="https://api.example.com/data",
extractMode="text",
maxChars=5000
)
// 使用 exec 调用 curl
exec(
command="curl -X GET https://api.example.com/data -H 'Authorization: Bearer TOKEN'",
capture_output=True
)二、实战案例 1:天气数据集成
场景说明
集成天气 API,获取实时天气数据并用于日常报告。
完整实现
javascript
// 1. 调用天气 API
weather_result = exec(
command=`curl -s "https://wttr.in/驻马店?format=j1"`,
capture_output=True
).stdout
// 2. 解析 JSON 数据
weather_data = JSON.parse(weather_result)
// 3. 提取关键信息
current = weather_data.current_condition[0]
forecast = weather_data.weather[0]
weather_report = \`
🌤️ 驻马店天气
当前温度:\${current.temp_C}°C
天气状况:\${current.weatherDesc[0].value}
风速:\${current.windspeedKmph} km/h
湿度:\${current.humidity}%
今日最高:\${forecast.maxtempC}°C
今日最低:\${forecast.mintempC}°C
建议:\${getWeatherAdvice(current, forecast)}
\`
// 4. 发送报告
message(
action="send",
channel="feishu",
target="chat_team",
message=weather_report
)
// 天气建议函数
function getWeatherAdvice(current, forecast) {
const temp = parseInt(current.temp_C)
if (temp < 10) return "天气寒冷,注意保暖"
if (temp > 30) return "天气炎热,注意防暑"
if (current.weatherDesc[0].value.includes("雨")) return "有雨,记得带伞"
return "天气适宜,适合户外活动"
}输出示例
🌤️ 驻马店天气
当前温度:15°C
天气状况:晴
风速:12 km/h
湿度:45%
今日最高:23°C
今日最低:11°C
建议:天气适宜,适合户外活动三、实战案例 2:邮件 API 集成
场景说明
集成邮件服务 API,实现邮件自动发送和接收。
完整实现
javascript
// 邮件发送函数
async function sendEmail(to, subject, body, attachments=[]) {
const payload = {
to,
subject,
html: body,
attachments
}
const result = exec(
command=`curl -X POST https://api.mailgun.net/v3/messages \\
-s \\
-u "api:\${process.env.MAILGUN_API_KEY}" \\
-d "from=通知 <noreply@example.com>" \\
-d "to=\${to}" \\
-d "subject=\${subject}" \\
-d "html=\${encodeURIComponent(body)}"`,
capture_output=True
)
const response = JSON.parse(result.stdout)
if (response.id) {
console.log(`✅ 邮件发送成功:\${response.id}`)
return { success: true, id: response.id }
} else {
console.log(`❌ 邮件发送失败:\${response.message}`)
return { success: false, error: response.message }
}
}
// 使用示例
await sendEmail(
"user@example.com",
"每日报告 - 2026-03-19",
\`
<h1>每日报告</h1>
<p>今日完成 12 篇文章发布</p>
<p>总字数:115,000+ 字</p>
\`,
["./report.pdf"]
)四、实战案例 3:GitHub API 集成
场景说明
集成 GitHub API,自动创建 Issue、管理仓库。
完整实现
javascript
// 创建 GitHub Issue
async function createIssue(repo, title, body, labels=[]) {
const payload = {
title,
body,
labels
}
const result = exec(
command=`curl -X POST https://api.github.com/repos/\${repo}/issues \\
-s \\
-H "Authorization: Bearer \${process.env.GITHUB_TOKEN}" \\
-H "Accept: application/vnd.github.v3+json" \\
-d '\${JSON.stringify(payload)}'`,
capture_output=True
)
const issue = JSON.parse(result.stdout)
if (issue.number) {
console.log(`✅ Issue 创建成功:#\${issue.number}`)
console.log(`链接:\${issue.html_url}`)
return issue
} else {
console.log(`❌ 创建失败:\${issue.message}`)
return null
}
}
// 使用示例
await createIssue(
"leiclaw/ai-knowledge-base",
"添加新教程:浏览器自动化",
\`
## 内容概述
新增浏览器自动化实战教程,包含 5 个实战案例。
## 字数
10,952 字
## 案例
1. 百度热搜抓取
2. 自动化表单提交
3. 网站监控告警
4. 批量截图工具
5. 高级技巧
\`,
["教程", "优先级:高"]
)五、高级技巧
1. 错误处理和重试
javascript
async function fetchWithRetry(url, maxRetries=3) {
for (let i = 0; i < maxRetries; i++) {
try {
const result = exec(
command=`curl -s "\${url}"`,
capture_output=True,
timeout=30
)
if (result.code === 0) {
return JSON.parse(result.stdout)
}
} catch (e) {
console.log(`重试 \${i+1}/\${maxRetries}`)
if (i === maxRetries - 1) throw e
exec(command="sleep 2")
}
}
}2. 批量请求
javascript
async function batchRequest(urls, concurrency=5) {
const results = []
for (let i = 0; i < urls.length; i += concurrency) {
const batch = urls.slice(i, i + concurrency)
const batchResults = await Promise.all(
batch.map(url => fetchWithRetry(url))
)
results.push(...batchResults)
// 避免请求过快
if (i + concurrency < urls.length) {
exec(command="sleep 1")
}
}
return results
}3. 数据缓存
javascript
const cache = new Map()
async function cachedFetch(url, ttl=3600000) {
const cached = cache.get(url)
if (cached && Date.now() - cached.timestamp < ttl) {
return cached.data
}
const data = await fetchWithRetry(url)
cache.set(url, { data, timestamp: Date.now() })
return data
}六、常见问题
Q: 如何处理 API 认证?
A:
- API Key:放在请求头或查询参数
- OAuth:使用授权码获取 access_token
- Bearer Token:
Authorization: Bearer TOKEN
Q: 如何处理大文件上传?
A: 使用分片上传,避免超时。
Q: 如何限流?
A: 添加请求间隔,使用令牌桶算法。
七、总结
API 集成让 OpenClaw 可以连接外部服务,实现更强大的自动化。
相关资源: